// object 表示一个对象
let o: object;
o = {};
o = function() {
};

/* 
* {} 用来表示对象中可以包含哪些属性
* 语法：{ 属性名:属性值, 属性名:属性值 }
* 在属性名后加上 ? ，表示属性是可选的  
*/
let obj: {name:string, age?:number};
obj = {name:'张三', age: 18};

// [propName: string]: any 表示任意类型的属性
let obj1: {name:string, [propName: string]: any};
obj1 = {name: '小盘', age: 18, gender: '男'};

/**
 * 设置函数结构的类型声明
 * 语法：(形参:类型, 形参:类型...) => 返回值
 */
let fun2: (a:number, b:number) => number
fun2 = function(n1: number, n2: number): number {
  return 1;
}

/**
 * 数组的类型声明
 * 语法：[类型] 或者 Array<类型>
 */
// string[] 表示字符串数组
let sAry: string[];
sAry = ['hello', 'ts'];

// number[] 表示数值数组
let nAry: number[];
nAry = [1, 2, 3];

let nAry1: Array<number>;
nAry1 = [4, 5, 6];

/**
 * 元组，就是固定长度的数组
 *  语法：[类型, 类型, 类型]
 */
let t: [string, number];
t = ['ts', 666];

/**
 * 枚举 enum
 */
enum Gender {
  Male,
  Female
}
let i: {name: string, gender: Gender};
i = {
  name: '诸葛亮',
  gender: Gender.Male
}
console.log(i.gender); //0

// & 表示同时
let obj2: {name: string} & {age: number};
obj2 = {name: '诸葛亮', age: 20};

// 类型的别名
type myType = 1 | 2| 3| 4 | 5;
let k: myType;
let l: myType;
let m: myType;

k = 2;
l = 3;
// m = 6; //不能将类型“6”分配给类型“myType”
